package oyente;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.util.Hashtable;
import java.util.Map;
import personaje.Mario;

/**
 * Clase utilizada para poder realizar el manejo de varias teclas presionadas al
 * mismo tiempo
 * 
 * @author Agustin Orge (LU.85538)
 * @author Victoria Martinez de la Cruz (LU.87620)
 */
@SuppressWarnings("serial")
public class ProcesadorTeclas extends javax.swing.Timer {

	/** Constante de la tecla para saltar */
	final static int saltar = KeyEvent.VK_UP;

	/** Constante de la tecla para ir a la izquierda */
	final static int izquierda = KeyEvent.VK_LEFT;

	/** Constante de la tecla para ir a la derecha */
	final static int derecha = KeyEvent.VK_RIGHT;

	/** Mario */
	private Mario mario;

	/** Ultima tecla presionada */
	private int lastKey;

	/** Mapeo que contiene las teclas */
	private Map<Integer, Boolean> teclas;

	/**
	 * Constructor de un procesador de teclas
	 * 
	 * @param delay
	 *            tiempo
	 * @param listener
	 *            oyente
	 * @param m
	 *            Mario
	 */
	public ProcesadorTeclas(int delay, ActionListener listener, Mario m) {
		super(delay, listener);
		teclas = new Hashtable<Integer, Boolean>();
		mario = m;

		teclas.put(saltar, false);
		teclas.put(izquierda, false);
		teclas.put(derecha, false);

		ActionListener oyente = crearOyente();

		addActionListener(oyente);
	}
	
	// Consultas

	/**
	 * Metodo privado utilizado para crear un oyente con los comportamientos
	 * segun las teclas que se encuentran presionadas
	 * 
	 * @return oyente
	 */
	private ActionListener crearOyente() {
		ActionListener oyente = new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {
				if (teclas.get(saltar) && teclas.get(izquierda)) {
					mario.saltarIzquierda();
					mario.getNivel().getGrafica().getPanelMario()
							.saltarIzquierda();
				} else if (teclas.get(saltar) && teclas.get(derecha)) {
					mario.saltarDerecha();
					mario.getNivel().getGrafica().getPanelMario()
							.saltarDerecha();
				} else if (teclas.get(saltar)) {
					mario.saltar();
					if (lastKey == KeyEvent.VK_LEFT) {
						mario.getNivel().getGrafica().getPanelMario()
								.saltarIzquierda();
					} else {
						mario.getNivel().getGrafica().getPanelMario()
								.saltarDerecha();
					}
				} else if (teclas.get(izquierda)) {
					mario.moverIzquierda();
					mario.getNivel().getGrafica().getPanelMario()
							.moverIzquierda();
					lastKey = KeyEvent.VK_LEFT;
				} else if (teclas.get(derecha)) {
					mario.moverDerecha();
					mario.getNivel().getGrafica().getPanelMario()
							.moverDerecha();
					lastKey = KeyEvent.VK_RIGHT;
				}
			}
		};

		return oyente;
	}
	
	/**
	 * Retorna la ultima tecla presionada
	 * 
	 * @return ultima tecla presionada
	 */
	public int getLast() {
		return lastKey;
	}
	
	// Comandos

	/**
	 * Setea si una tecla se encuentra presionada o no
	 * 
	 * @param tecla
	 * @param estado
	 */
	public void setTecla(int tecla, boolean estado) {
		teclas.put(tecla, estado);
	}	

	/**
	 * Setea la ultima tecla presionada
	 * 
	 * @param ultima
	 *            tecla presionada
	 */
	public void setLastKey(int last) {
		lastKey = last;
	}

}
